// let s = "A man, a plan, a canal: Panama";
// var isPalindrome = function (s) {
//     if (s.length === 0) {
//         return true;
//     }

//     // 简化字符处理函数
//     function getValidChar(char) {
//         const ascii = char.charCodeAt(0);
//         // 数字直接返回
//         if (48 <= ascii && ascii <= 57) return char;
//         // 字母返回小写形式
//         if (65 <= ascii && ascii <= 90 || ascii >= 97 && ascii <= 122) {
//             return char.toLowerCase();
//         }
//         return null; // 非字母数字字符
//     }

//     const s1 = [...s];
//     let left = 0;
//     for (let i = 0; i < s1.length; i++) {
//         const validChar = getValidChar(s1[i]);
//         if (validChar !== null) {
//             s1[left] = validChar; // 关键：使用处理后的字符
//             left++;
//         }
//     }
//     s1.length = left; // 截断数组

//     // 比较处理后的字符串和反转字符串
//     return s1.join('') === s1.slice().reverse().join('');
// };
// console.log(isPalindrome(s)); // true





let s = "A man, a plan, a canal: Panama";
var isPalindrome = function (s) {
    if (s.length === 0) {
        return true;
    }
    function getValidChar(char) {
        const ascii = char.charCodeAt(0);
        // 数字直接返回
        if (48 <= ascii && ascii <= 57) return char;
        // 字母返回小写形式
        if (65 <= ascii && ascii <= 90 || ascii >= 97 && ascii <= 122) {
            return char.toLowerCase();
        }
        return null; // 非字母数字字符
    }
    let left = 0
    let rigth = s.length - 1
    while (left < rigth) {
        if (getValidChar(s[left]) === null) {
            left++
        }
        else if (getValidChar(s[rigth]) === null) {
            rigth--
        }
        else if (getValidChar(s[left]) === getValidChar(s[rigth])) {
            left++
            rigth--
        }
        else { return false }
    }
    return true

};
console.log(isPalindrome(s)); // true